import java.util.Arrays;
import java.util.Stack;

public class MyStack {
    int [] elem;//创建一个数组
    int usedSize;//记录栈中的元素
    public  static  final int DEFIND_SIZE=10;//默认数组容量
    public MyStack(){
        this.elem=new int[DEFIND_SIZE];//进行初始化
    }
    //入栈
    public  void push(int data){
        //要先判断栈是否是满的
        if(isFull()){
            //满了就要进行扩容
            this.elem= Arrays.copyOf(this.elem,
                    this.elem.length*2);
        }
        //未满。就要数据元素进栈
        this.elem[usedSize]=data;
        //记录数据个数加
        usedSize++;
    }

    /**
     * 返回ture 表示满
     * @return
     */
    public boolean isFull(){
        return usedSize>=elem.length;
    }
    //出栈
    public int pop(){
        //要判断栈是否为空
        if(empty()){//栈空
            throw  new EmptyWrongException("此栈为空,无法删除");
        }//栈不空，删除元素
       // usedSize--;//记录有效元素个数减。
        return this.elem[--usedSize];
    }

    /**
     * usedSize==0,表示栈中元素个数为0，返回ture
     * @return
     */
    public  boolean empty(){
        return usedSize==0;
    }
  //获取栈顶元素
    public  int peek(){
        //要判断栈是否为空
        if(empty()){
            throw  new EmptyWrongException("栈为空，无法查看");
        }
        return this.elem[usedSize-1];
    }
    //括号匹配
    public int evalRPN(String[] tokens) {
        Stack<Integer> stack = new Stack<>();
        for (String x:tokens) {
            if(!isoperation(x)){
                stack.push(Integer.parseInt(x));
            }else{
                int num1=stack.pop();
                int num2=stack.pop();
                switch (x){
                    case "+":
                        stack.push(num2+num1);
                        break;
                    case "-":
                        stack.push(num2-num1);
                        break;
                    case "/":
                        stack.push(num2/num1);
                        break;
                    case "*":
                        stack.push(num2*num1);
                        break;
                }
            }

        }
        return stack.pop();

    }
    protected  boolean isoperation(String x){
        if(x.equals("*")||x.equals("/")||
                x.equals("+")||x.equals("-")){
            return true;
        }
        return false;
    }
}

